package com.et114.core.utility;

import java.text.SimpleDateFormat;
import java.util.*;
import java.text.*;

/**
 * 
 * @author yongkangz
 * 
 */
public class DateUtil {
	/**
	 * 
	 */
	private static final long	serialVersionUID	= 1L;

	/**
	 * 年
	 */
	public int					year;

	/**
	 * 月
	 */
	public int					month;

	/**
	 * 日
	 */
	public int					day;

	/**
	 * 小时
	 */
	public int					hours;

	/**
	 * 分钟
	 */
	public int					minutes;

	/**
	 * 秒
	 */
	public int					seconds;

	private DateUtil ( ) {
		super();
	}

	/**
	 * 得到今天的时间
	 * 
	 * @return 今天的时间
	 */
	public static Date getToday ( ) {
		return new Date();
	}

	/**
	 * 得到制定格式的时间;(如:yyyy-MM-dd HH:mm:ss)
	 * 
	 * @return 返回时间 (yyyy-MM-dd HH:mm:ss)
	 */
	public static String getFormarDate ( Date date , String format ) {
		SimpleDateFormat sdf = new SimpleDateFormat( format );
		StringBuffer tb = new StringBuffer();
		return sdf.format( date, tb, new FieldPosition( 0 ) ).toString();

	}

	/**
	 * 得到制定格式的时间;(如:yyyy-MM-dd HH:mm:ss or yyyy-MM-dd)
	 * 
	 * @param if(isTime)
	 *            时间精确到秒(yyyy-MM-dd HH:mm:ss);
	 * @param else
	 *            时间精确到日(yyyy-MM-dd)
	 * @return 返回时间 (yyyy-MM-dd HH:mm:ss) 或 (yyyy-MM-dd)
	 */

	public static String getTodayString ( boolean isTime ) {
		SimpleDateFormat sdf;
		if ( isTime ) {
			sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
		} else {
			sdf = new SimpleDateFormat( "yyyy-MM-dd" );
		}
		StringBuffer tb = new StringBuffer();
		return sdf.format( new Date(), tb, new FieldPosition( 0 ) ).toString();

	}

	// ding add by 2002.12.30
	/**
	 * 对时间进行格式化,只有长度为10位(到日)或19位(到秒)的才返回值,其余的返回为空;
	 * 
	 * @param dateString
	 *            时间类型.有两种(一:10位2002-12-10;二:19位2002-12-10 12:24:03)
	 * @return 返回格式化后的时间.有两种(一:20021210;二:20021210122403)
	 */
	public static String getFmtString ( String dateString ) {
		String outDate = "";
		String y;
		String m;
		String d;
		String h;
		String mi;
		String s;
		if ( dateString == null )
			return outDate;
		if ( dateString.length() == 10 || dateString.length() == 19 ) {
			y = dateString.substring( 0, 4 );
			m = dateString.substring( 5, 7 );
			d = dateString.substring( 8, 10 );
			outDate = y + m + d;
			if ( dateString.length() > 10 ) {
				h = dateString.substring( 11, 13 );
				mi = dateString.substring( 14, 16 );
				s = dateString.substring( 17, 19 );
				outDate += h + mi + s;
			}
		}
		return outDate;
	}

	// Ding add by 2002-11-19
	/**
	 * 把时间转化为定制的格式(如：2002-11-19,2002-11-20 24:12:30)
	 * 
	 * @param outputDate
	 *            需要进行转化的时间.有两种(一:8位20021119;二:14位20021120241230)
	 * @return 返回定制的时间格式,有两种(一:2002-11-19;二:2002-11-20 24:12:30)
	 */
	public static String getDateOutput ( String outputDate ) {
		String outDate = "";
		if ( outputDate == null )
			return outDate;
		if ( outputDate.trim().length() >= 8 ) {
			String year = outputDate.substring( 0, 4 );
			String month = outputDate.substring( 4, 6 );
			String day = outputDate.substring( 6, 8 );
			outDate = year + "-" + month + "-" + day;
			if ( outputDate.trim().length() > 8 ) {
				String hour = outputDate.substring( 8, 10 );
				String minute = outputDate.substring( 10, 12 );
				outDate += " " + hour + ":" + minute;
				if ( outputDate.trim().length() > 12 ) {
					String second = outputDate.substring( 12, 14 );
					outDate += ":" + second;
				}
			}
		}
		return outDate;
	}

	// Ding add by 2003-05-12
	/**
	 * 得到当前的时间,只到日.
	 * 
	 * @param outputDate
	 *            需要进行转化的时间
	 * @param style
	 *            日期中间的样式 如"-","/"
	 * @return 返回定制的时间格式 (如:2003/01/09)
	 */
	public static String getDateOut ( String outputDate , String style ) {
		String outDate = "";
		if ( outputDate == null )
			return outDate;
		if ( outputDate.trim().length() >= 8 ) {
			String year = outputDate.substring( 0, 4 );
			String month = outputDate.substring( 4, 6 );
			String day = outputDate.substring( 6, 8 );
			outDate = year + style + month + style + day;
		}
		return outDate;
	}
	/**
	 * 入: 2002-11-19,2002-11-20 24:12:30
	 * 返回定制的时间格式 (如:01/09/2003)
	 * @param outputDate
	 * @param style
	 * @return
	 */
	public static String getDateOutUSA ( String outputDate , boolean f ) {
		if(outputDate==null)
			outputDate=getTodayString ( f ); 
		String outDate = ""; 
		String year = outputDate.substring( 0, 4 ); 
		String month = outputDate.substring( 5, 7 );
		String day = outputDate.substring( 8, 10 );
		outDate = month + "/" + day + "/" + year; 
		if ( outputDate.trim().length() >10 ) {
			outDate+=" "+outputDate.substring ( 11 , outputDate.length ( ) );
		}
		return outDate;
	}

	/**
	 * 把时间转化为定制的格式(如：2002年11月19日)
	 * 
	 * @param outputDate需要进行转化的时间(如:20021119)
	 * @return 返回定制的时间格式(如：2002年11月19日)
	 */
	public static String getDateOutputChn ( String outputDate ) {
		String outDate = "";
		if ( outputDate == null )
			return outDate;
		if ( outputDate.trim().length() >= 8 ) {
			String year = outputDate.substring( 0, 4 );
			String month = outputDate.substring( 4, 6 );
			String day = outputDate.substring( 6, 8 );
			outDate = year + "年" + month + "月" + day + "日";
		}
		return outDate;
	}

	// Jony add by 2003-2-27
	/**
	 * 把时间转化为定制的格式(如：2002-11-19,2002-11-20 24:12:30)
	 * 
	 * @param outputDate
	 *            需要进行转化的时间.有两种(一:8位20021119;二:14位20021120241230)
	 * @return 返回定制的时间格式,有两种(一:2002年11月19日;二:2002年11月24日 24时12分30秒)
	 */
	public static String getDateOutputChnMore ( String outputDate ) {
		String outDate = "";
		if ( outputDate == null )
			return outDate;
		if ( outputDate.trim().length() >= 8 ) {
			String year = outputDate.substring( 0, 4 );
			String month = outputDate.substring( 4, 6 );
			String day = outputDate.substring( 6, 8 );
			outDate = year + "年" + month + "月" + day + "日";
			if ( outputDate.trim().length() > 8 ) {
				String hour = outputDate.substring( 8, 10 );
				String minute = outputDate.substring( 10, 12 );
				outDate += " " + hour + "时" + minute + "分";
				// if(outputDate.length() > 12){
				// String second = outputDate.substring(12, 14);
				// outDate += second+"秒";
				// }
			}
		}
		return outDate;
	}

	/**
	 * 年份选择下拉框
	 * 
	 * @param startYear
	 *            开始年份
	 * @param endYear
	 *            结束年份
	 * @return 下拉框形式的String
	 */
	// weigang 20030114
	public static String toHtmlSelect ( int startYear , int endYear ) {
		String options = "";
		int length = endYear - startYear;
		if ( length < 0 ) {
			length = 0;
		}
		for ( int i = 0; i < length; i++ ) {
			options += "<option ";
			options += " value='" + startYear + "' >";
			startYear++;
			options += "" + startYear;
			options += "</option>\n";
		}
		return options;
	}

	/**
	 * 显示小时
	 * 
	 * @param hour
	 *            传过来的时间参数
	 * @return String
	 */
	// Ding add by 2003.02.18
	public static String toHtmlSelectWithHour ( int hour ) {
		String options = "";
		for ( int i = 0; i <= 23; i++ ) {
			if ( i < 10 ) {
				options += "<option value='0" + i + "'";
			} else {
				options += "<option value='" + i + "'";
			}
			if ( i == hour ) {
				options += " selected ";
			}
			options += ">";
			if ( i < 10 ) {
				options += "0" + i;
			} else {
				options += i;
			}
			options += "</option>\n";
		}
		return options;
	}

	/**
	 * 显示分钟，以10分钟为一个单位
	 * 
	 * @param hour
	 *            传过来的时间参数
	 * @return String
	 */
	// Ding add by 2003.02.18
	public static String toHtmlSelectWithMinute ( int minute ) {
		String options = "";
		int minutes = Integer.parseInt( ( minute + "" ).substring( 0, 1 ) );
		for ( int i = 0; i <= 5; i++ ) {
			options += "<option value='" + i + "0'";
			if ( i == minutes ) {
				options += " selected ";
			}
			options += ">";
			options += i + "0";
			options += "</option>\n";
		}
		return options;
	}

	/**
	 * 格式化字符串得到小时
	 * 
	 * @param dateString
	 *            时间值共12位
	 * @return Result
	 */
	public static int getFmtHour ( String dateString ) {
		int hour = 9;
		if ( dateString == null )
			return hour;
		if ( dateString.trim().length() >= 12 ) {
			hour = Integer.parseInt( dateString.substring( 8, 10 ) );
			return hour;
		} else {
			return hour;
		}
	}

	/**
	 * 格式化字符串得到分钟
	 * 
	 * @param dateString
	 *            时间值共12位
	 * @return Result
	 */
	public static int getFmtMinute ( String dateString ) {
		int minute = 0;
		if ( dateString == null )
			return minute;
		if ( dateString.trim().length() >= 12 ) {
			minute = Integer.parseInt( dateString.substring( 10, 12 ) );
			return minute;
		} else {
			return minute;
		}
	}

	/**
	 * 得到月份中文
	 * 
	 * @param int
	 *            month
	 * @return modifier:michel date:2003-6-11
	 */
	public static String getMonth_CN ( int month ) {
		String monthcn = "";
		switch ( month ) {

		case 1:
			monthcn = "1月";
			break;
		case 2:
			monthcn = "2月";
			break;
		case 3:
			monthcn = "3月";
			break;
		case 4:
			monthcn = "4月";
			break;
		case 5:
			monthcn = "5月";
			break;
		case 6:
			monthcn = "6月";
			break;
		case 7:
			monthcn = "7月";
			break;
		case 8:
			monthcn = "8月";
			break;
		case 9:
			monthcn = "9月";
			break;
		case 10:
			monthcn = "10月";
			break;
		case 11:
			monthcn = "11月";
			break;
		case 12:
			monthcn = "12月";
			break;

		}
		return monthcn;
	}

	/**
	 * 根据所给日期获得格式化后的日期字符串
	 * 
	 * @param Calendar
	 *            日期
	 * @param String
	 *            格式，如"yyyy-MM-dd HH:mm:ss"
	 * @return String 格式化日期
	 */
	public static String getString ( Calendar cl , String format ) {
		SimpleDateFormat sdf = new SimpleDateFormat( format );
		return sdf.format( Calendar.getInstance().getTime() );
	}

	/**
	 * 获得当前服务器日期的格式化字符串
	 * 
	 * @param String
	 *            日期格式
	 * @return String 格式后的当前服务器日期
	 */
	public static String getString ( String format ) {
		return getString( Calendar.getInstance(), format );
	}

	/**
	 * 根据所给年月日获得格式化后的日期
	 * 
	 * @param int
	 *            年 如果是-1则不起效
	 * @param int
	 *            月 如果是-1则不起效
	 * @param int
	 *            日 如果是-1则不起效
	 * @param String
	 *            日期格式
	 * @return String 格式后的日期
	 */
	public static String getString ( int y , int m , int d , String format ) {
		Calendar cl = Calendar.getInstance();
		if ( y != -1 )
			cl.set( Calendar.YEAR, y );
		if ( m != -1 )
			cl.set( Calendar.MONTH, m );
		if ( d != -1 )
			cl.set( Calendar.DATE, d );
		return getString( cl, format );
	}

	/**
	 * 根据所给年月日获得格式化后的日期
	 * 
	 * @param int
	 *            年 如果是-1则不起效
	 * @param int
	 *            月 如果是-1则不起效
	 * @param int
	 *            日 如果是-1则不起效
	 * @param int
	 *            时 如果是-1则不起效
	 * @param int
	 *            分 如果是-1则不起效
	 * @param int
	 *            秒 如果是-1则不起效
	 * @param String
	 *            日期格式
	 * @return String 格式后的日期
	 */
	public static String getString ( int y , int m , int d , int h , int mm ,
			int s , String format ) {
		Calendar cl = Calendar.getInstance();
		if ( y != -1 )
			cl.set( Calendar.YEAR, y );
		if ( m != -1 )
			cl.set( Calendar.MONTH, m );
		if ( d != -1 )
			cl.set( Calendar.DATE, d );
		if ( h != -1 )
			cl.set( Calendar.HOUR, h );
		if ( mm != -1 )
			cl.set( Calendar.MINUTE, mm );
		if ( s != -1 )
			cl.set( Calendar.SECOND, s );
		return getString( cl, format );
	}

	/**
	 * 清除格式，得到所有是去除非数字字符后的字符串
	 * 
	 * @param String
	 *            字符串
	 * @return String 字符串
	 */
	public static String trimFormat ( String sdate ) {
		if ( sdate == null || sdate.length() == 0 )
			return sdate;
		String bases = "0123456789";
		StringBuffer sb = new StringBuffer();
		char [ ] sc = sdate.toCharArray();
		for ( int i = 0; i < sc.length; i++ ) {
			String temps = String.valueOf( sc [ i ] );
			if ( bases.indexOf( temps ) != -1 )
				sb.append( temps );
		}
		return sb.toString();
	}

	/**
	 * 将指定格式的日期字符串转换成一个日期类型对象
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @param format
	 *            日期字符串格式
	 * @return 日期对象
	 * @author junkail
	 */
	public static Date parseDate ( String dateStr , String format ) {
		if ( dateStr == null || format == null )
			return null;
		DateFormat fmt = new SimpleDateFormat( format );
		try {
			return fmt.parse( dateStr );
		} catch ( ParseException e ) {

			return null;
		}
	}

	/**
	 * 将格式为"yyyy-MM-dd HH:mm:ss"的日期字符串转换成一个日期对象
	 * 
	 * @param dateStr
	 *            日期字符串
	 * @return 日期对象
	 * @author junkail
	 */
	public static Date parseDate ( String dateStr ) {
		return parseDate( dateStr, "yyyy-MM-dd HH:mm:ss" );
	}

	/**
	 * 将一个日期对象转换成指定格式的字符串
	 * 
	 * @param date
	 *            日期对象
	 * @param format
	 *            输出格式
	 * @return 格式化的日期字符串
	 * @author junkail
	 */
	public static String formatDate ( Date date , String format ) {
		if ( date == null || format == null )
			return null;
		DateFormat fmt = new SimpleDateFormat( format );
		return fmt.format( date );
	}

	/**
	 * 
	 * @param date
	 * @param format
	 * @return
	 */
	public static String formatDate ( String date , String format ) {
		if ( date == null || format == null )
			return null;
		DateFormat fmt = new SimpleDateFormat( format );
		while ( date.length() < 14 )
			date = date.concat( "0" );
		return fmt.format( parseDate( date, "yyyyMMddHHmmss" ) );
	}

	/**
	 * 将一个日期对象转换成一个格式为"yyyy-MM-dd HH:mm:ss"的字符串
	 * 
	 * @param date
	 *            日期对象
	 * @return 格式化的日期字符串
	 * @author junkail
	 */
	public static String formatDateTime ( Date date ) {
		return formatDate( date, "yyyy-MM-dd HH:mm:ss" );
	}

	/**
	 * 将一个日期对象转换成一个格式为"HH:mm:ss"的字符串
	 * 
	 * @param date
	 *            日期对象
	 * @return 格式化的日期字符串
	 * @author junkail
	 */
	public static String formatTime ( Date date ) {
		return formatDate( date, "HH:mm:ss" );
	}

	/**
	 * 取得指定日期增加/减少（n为负数）n天后的日期
	 * 
	 * @param date
	 * @param n
	 *            要增加天数
	 * @return
	 */
	public static Date add ( Date date , int n ) {
		if ( date == null )
			return null;
		GregorianCalendar cal = new GregorianCalendar();
		cal.setTime( date );
		cal.add( Calendar.DATE, n );
		return cal.getTime();
	}

	/**
	 * 在当前日期下增加/减少n天后的日期
	 * 
	 * @param n
	 * @return
	 */
	public static Date add ( int n ) {
		GregorianCalendar cal = new GregorianCalendar();
		cal.add( Calendar.DATE, n );
		return cal.getTime();
	}

	/**
	 * 取得当前日期
	 * 
	 * @return
	 */
	public static Date getCurrentDate ( ) {
		return Calendar.getInstance().getTime();
	}

	/**
	 * 将一个日期对象转换成一个格式为"yyyy-MM-dd"的字符串
	 * 
	 * @param date
	 *            日期对象
	 * @return 格式化的日期字符串
	 * @author junkail
	 */
	public static String formatDate ( Date date ) {
		return formatDate( date, "yyyy-MM-dd" );
	}

	public static void main ( String [ ] args ) {
		System.out.println( formatDate( new Date(), "yyyyMMddHHmmss" ) );
	}
}